{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([\n",
    "    [5, 1],  # 用户1\n",
    "    [4, 2],  # 用户2\n",
    "    [2, 5],  # 用户3\n",
    "    [1, 4],  # 用户4\n",
    "    [3, 2],  # 用户5\n",
    "    [2, 5]   # 用户6\n",
    "])\n",
    "\n",
    "# 对应的电影类型标签（动作片为0，喜剧片为1）\n",
    "y = np.array([0, 0, 1, 1, 0, 1])\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=3)  # 选择3个最近邻居\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=3)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=3)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=3)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "该用户可能偏好喜剧片\n"
     ]
    }
   ],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)\n",
    "\n",
    "# 输出预测结果\n",
    "if prediction == 0:\n",
    "    print(\"该用户可能偏好动作片\")\n",
    "else:\n",
    "    print(\"该用户可能偏好喜剧片\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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+OGHBgmMiIiIqLbpXRjt378fgwcPRtOmTXHu3Dk8/vjjSE9PhxACnTp1MkaMRERERLVC79v1582bh7lz5+K3336DnZ0dEhIScPnyZfTq1QvPPfecMWIkIiIiqhV6F0Znz55VPwlbKpXiwYMHcHR0xJtvvol3333X4AESERER1Ra9C6N69epBLpcDALy8vHDhwgX1uhs3bhguMiIiIqJapvcco65du+LQoUNo27YtwsLCMHfuXJw5cwbbtm1D165djREjERERUa3QuzD68MMPce/ePQDAokWLcO/ePWzduhUtWrRQPwSSiIiIyBzpVRgVFxfj8uXLCAgIAAA4ODjg008/NUpgRERERLVNrzlG1tbW6N+/P+7cuWOkcIiIiIhMR+/J1+3bt8c///xjjFiIiIiITErvwmjJkiWIjIzErl27kJWVhby8PI0fIiIiInOl9+TrZ555BgAwePBgSCQSdbsQAhKJBMXFxYaLjoiIiKgW8SWyRERERCp6F0a9evUyRhxEREREJqf3HCMiIiIiS8XCiIiIiEiFhRERERGRikkLo9WrVyMgIADOzs5wdnZGcHAwvv/++0q3SU5ORufOnWFnZ4dmzZohJiamlqIlIiIiS1fjwqiwsFD97jR9eXt7Y9myZThx4gROnDiBp59+GuHh4fj999919r948SIGDhyIHj16IC0tDfPnz8err76KhISEmqRAREREBEDPwmjdunV45ZVXsGnTJgDAvHnz4OTkhPr16yMkJAQ3b97U6+CDBg3CwIED4e/vD39/fyxZsgSOjo44evSozv4xMTFo0qQJoqOj0aZNG0yePBkTJ07E8uXL9TouERERkS7Vvl1/yZIlWLJkCZ566inEx8cjNTUVO3bswJtvvgkrKyusWrUKCxYswOrVqx8qkOLiYnz99de4f/8+goODdfY5cuQIQkNDNdr69++P2NhYKBQK2NjYaG0jl8shl8vVy6VP51YoFFAoFA8Va0VK92fo/dYVlp4fYPk5Mj/zZ+k5Mj/zZ6wca+szkwghRHU6tmzZEm+++SZGjx6NEydO4Mknn8TWrVsxYsQIAMD333+PadOm4dKlS3oFcObMGQQHB6OgoACOjo6Ij4/HwIEDdfb19/fH+PHjMX/+fHXb4cOH0a1bN1y9ehWenp5a2yxatAiLFy/Wao+Pj4eDg4NesRIREZFp5OfnY8yY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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "plt.title(\"User Movie Preference\", size=15)\n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点\n",
    "colors = ['blue', 'blue', 'red', 'red', 'blue', 'red']\n",
    "for i in range(len(X)):\n",
    "    plt.scatter(X[i, 0], X[i, 1], c=colors[i], label=\"Action\" if y[i] == 0 else \"Comedy\")\n",
    "\n",
    "# 绘制新数据点\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=8)\n",
    "\n",
    "# 找到最近邻索引和距离\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0][0]]  # 获取最近邻点的坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本\n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})')\n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
